Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Displaying Raw • Download


meshchatx/src/frontend/components/interfaces/AddInterfacePage.vue 824d84e3aca83dea2c4ae7db37ed265790454281 (824d84e3) Text, 69.02 KB

Tb4b4b4<Tff7b72templateTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex flex-col flex-1 overflow-hidden min-w-0 bg-slate-50 dark:bg-zinc-950"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"overflow-y-auto p-4 md:p-8 space-y-6 max-w-5xl mx-auto w-full"Tb4b4b4>
T8b949e<!-- Header Section -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center justify-between gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"min-w-0"Tb4b4b4>
Tb4b4b4<Tff7b72h1 Te6edf3classTff7b72=Ta5d6ff"text-2xl font-bold text-gray-900 dark:text-white flex items-center gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon
Tb4b4b4:Te6edf3icon-nameTff7b72=Ta5d6ff"Te6edf3isEditingInterface Tff7b72? Ta5d6ff'pencil' Tff7b72: Ta5d6ff'plus-circle-outline'Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"size-7 text-blue-500"
Tb4b4b4/Tb4b4b4>
Tff7b72{{ Te6edf3isEditingInterface Tff7b72? Te6edf3$tTb4b4b4(Ta5d6ff"interfaces.edit_interface"Tb4b4b4) Tff7b72: Te6edf3$tTb4b4b4(Ta5d6ff"interfaces.add_interface"Tb4b4b4) Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72h1Tb4b4b4>
Tb4b4b4<Tff7b72p Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-600 dark:text-zinc-400 mt-1"Tb4b4b4>
Tff7b72{{
Te6edf3isEditingInterface
Tff7b72? Ta5d6ff"Update existing connection settings."
Tff7b72: Ta5d6ff"Create a new connection to the Reticulum network."
Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72RouterLink Tb4b4b4:Te6edf3toTff7b72=Ta5d6ff"Tb4b4b4{ Te6edf3nameTff7b72: Ta5d6ff'interfaces' Tb4b4b4}Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"secondary-chip"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"arrow-left" Te6edf3classTff7b72=Ta5d6ff"size-4" Tb4b4b4/Tb4b4b4>
Back to List
Tb4b4b4<Tb4b4b4/Tff7b72RouterLinkTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Community Interfaces (Quick Start) -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Tff7b72!Te6edf3isEditingInterface Tff7b72&& Te6edf3config Tff7b72!= Tff7b72null Tff7b72&& Te6edf3configTb4b4b4.Te6edf3show_suggested_community_interfacesTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"glass-card !p-0 overflow-hidden"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"bg-gray-50/50 dark:bg-zinc-800/50 p-4 border-b border-gray-200 dark:border-zinc-800 flex items-center justify-between"
Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72h2 Te6edf3classTff7b72=Ta5d6ff"font-bold text-gray-900 dark:text-white flex items-center gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"lightning-bolt" Te6edf3classTff7b72=Ta5d6ff"size-5 text-yellow-500" Tb4b4b4/Tb4b4b4>
Community Quick-Start
Tb4b4b4<Tb4b4b4/Tff7b72h2Tb4b4b4>
Tb4b4b4<Tff7b72p Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-500 dark:text-zinc-400 mt-0.5"Tb4b4b4>
One-click configurations for public TCP relays.
Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"text-gray-400 hover:text-gray-600 dark:hover:text-zinc-200 transition-colors p-1"
Te6edf3titleTff7b72=Ta5d6ff"Hide suggested interfaces"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3updateConfigTb4b4b4(Tb4b4b4{ Te6edf3show_suggested_community_interfacesTff7b72: Tff7b72false Tb4b4b4}Tb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"close" Te6edf3classTff7b72=Ta5d6ff"size-5" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"divide-y divide-gray-100 dark:divide-zinc-800"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-forTff7b72=Ta5d6ff"Te6edf3communityIface Tff7b72in Te6edf3communityInterfacesTa5d6ff"
Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3communityIfaceTb4b4b4.Te6edf3nameTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex p-4 items-center hover:bg-gray-50/30 dark:hover:bg-zinc-800/20 transition-colors"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"min-w-0 flex-1"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"font-bold text-gray-900 dark:text-zinc-100"Tb4b4b4>Tff7b72{{ Te6edf3communityIfaceTb4b4b4.Te6edf3name Tff7b72}}Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"text-xs font-mono text-gray-500 dark:text-zinc-400 mt-0.5 flex items-center gap-2"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"server-network" Te6edf3classTff7b72=Ta5d6ff"size-3" Tb4b4b4/Tb4b4b4>
Tff7b72{{ Te6edf3communityIfaceTb4b4b4.Te6edf3target_host Tff7b72}}:Tff7b72{{ Te6edf3communityIfaceTb4b4b4.Te6edf3target_port Tff7b72}}
Tb4b4b4<Tff7b72span
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3communityIfaceTb4b4b4.Te6edf3online Tff7b72=== Tff7b72trueTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"text-green-500 flex items-center gap-1"
Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"size-1.5 rounded-full bg-green-500 animate-pulse"Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Online
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3v-else-ifTff7b72=Ta5d6ff"Te6edf3communityIfaceTb4b4b4.Te6edf3online Tff7b72=== Tff7b72falseTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"text-red-500"Tb4b4b4>OfflineTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3communityIfaceTb4b4b4.Te6edf3descriptionTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-400 dark:text-zinc-500 mt-1 italic line-clamp-1"
Tb4b4b4>
Tff7b72{{ Te6edf3communityIfaceTb4b4b4.Te6edf3description Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"primary-chip !py-1.5 !px-3"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"
Te6edf3newInterfaceName Tff7b72= Te6edf3communityIfaceTb4b4b4.Te6edf3nameTb4b4b4;
Te6edf3newInterfaceType Tff7b72= Te6edf3communityIfaceTb4b4b4.Te6edf3typeTb4b4b4;
Te6edf3newInterfaceTargetHost Tff7b72= Te6edf3communityIfaceTb4b4b4.Te6edf3target_hostTb4b4b4;
Te6edf3newInterfaceTargetPort Tff7b72= Te6edf3communityIfaceTb4b4b4.Te6edf3target_portTb4b4b4;
Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72spanTb4b4b4>Use ThisTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Find More Directory Links (Helpful Card) -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-1 md:grid-cols-2 gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"glass-card flex items-center gap-4 bg-blue-50/30 dark:bg-blue-900/10 border-blue-100 dark:border-blue-900/30"
Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"size-10 rounded-2xl bg-blue-500/10 flex items-center justify-center text-blue-500 shrink-0"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"map-search-outline" Te6edf3classTff7b72=Ta5d6ff"size-6" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1 min-w-0"Tb4b4b4>
Tb4b4b4<Tff7b72h3 Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold text-gray-900 dark:text-white"Tb4b4b4>Find more nodesTb4b4b4<Tb4b4b4/Tff7b72h3Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex gap-2 mt-1"Tb4b4b4>
Tb4b4b4<Tff7b72a
Te6edf3hrefTff7b72=Ta5d6ff"https://directory.rns.recipes/"
Te6edf3targetTff7b72=Ta5d6ff"_blank"
Te6edf3classTff7b72=Ta5d6ff"secondary-chip !py-1 !px-2 !text-[9px]"
Tb4b4b4>rns.recipesTb4b4b4<Tb4b4b4/Tff7b72a
Tb4b4b4>
Tb4b4b4<Tff7b72a Te6edf3hrefTff7b72=Ta5d6ff"https://rmap.world/" Te6edf3targetTff7b72=Ta5d6ff"_blank" Te6edf3classTff7b72=Ta5d6ff"secondary-chip !py-1 !px-2 !text-[9px]"
Tb4b4b4>rmap.worldTb4b4b4<Tb4b4b4/Tff7b72a
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Quick Import from Raw Config -->
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"glass-card flex flex-col gap-2 !p-4 bg-emerald-50/20 dark:bg-emerald-900/5 border-emerald-100 dark:border-emerald-900/20"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center justify-between"Tb4b4b4>
Tb4b4b4<Tff7b72h3
Te6edf3classTff7b72=Ta5d6ff"text-xs font-bold text-emerald-600 dark:text-emerald-500 uppercase tracking-widest flex items-center gap-2"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"import" Te6edf3classTff7b72=Ta5d6ff"size-4" Tb4b4b4/Tb4b4b4>
Quick Import
Tb4b4b4<Tb4b4b4/Tff7b72h3Tb4b4b4>
Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-[10px] text-gray-400"Tb4b4b4>Paste raw config hereTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72textarea
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3rawConfigInputTa5d6ff"
Te6edf3placeholderTff7b72=Ta5d6ff"[[Interface Name]]&#10;type = TCPClientInterface&#10;target_host = 1.2.3.4"
Te6edf3classTff7b72=Ta5d6ff"w-full h-16 bg-white/50 dark:bg-zinc-900/50 border border-emerald-100/50 dark:border-emerald-900/30 rounded-xl p-2 text-[10px] font-mono focus:ring-1 focus:ring-emerald-500 outline-none transition"
Tb4b4b4@Te6edf3inputTff7b72=Ta5d6ff"Te6edf3handleRawConfigInputTa5d6ff"
Tb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72textareaTb4b4b4>

T8b949e<!-- Multiple detected configs picker -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3detectedConfigsTb4b4b4.Te6edf3length Tff7b72> T79c0ff1Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"flex flex-wrap gap-2 mt-1"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3v-forTff7b72=Ta5d6ff"Te6edf3cfg Tff7b72in Te6edf3detectedConfigsTa5d6ff"
Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3cfgTb4b4b4.Te6edf3nameTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"bg-emerald-500/10 hover:bg-emerald-500/20 border border-emerald-500/20 rounded-lg px-2 py-1 text-[9px] font-bold text-emerald-600 dark:text-emerald-400 transition"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3applyConfigTb4b4b4(Te6edf3cfgTb4b4b4)Ta5d6ff"
Tb4b4b4>
Apply: Tff7b72{{ Te6edf3cfgTb4b4b4.Te6edf3name Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Main Form Card -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"glass-card space-y-8"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-1 md:grid-cols-2 gap-8"Tb4b4b4>
T8b949e<!-- Basic Info Column -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-6"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 pb-2 border-b border-gray-100 dark:border-zinc-800"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"information-outline" Te6edf3classTff7b72=Ta5d6ff"size-5 text-gray-400" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72h3 Te6edf3classTff7b72=Ta5d6ff"font-bold text-gray-900 dark:text-white"Tb4b4b4>Basic ConfigurationTb4b4b4<Tb4b4b4/Tff7b72h3Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Interface NameTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceNameTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Tb4b4b4:Te6edf3disabledTff7b72=Ta5d6ff"Te6edf3isEditingInterfaceTa5d6ff"
Te6edf3placeholderTff7b72=Ta5d6ff"e.g. Home Node or Mobile TCP"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Tb4b4b4[Te6edf3isEditingInterface Tff7b72? Ta5d6ff'cursor-not-allowed opacity-60' Tff7b72: Ta5d6ff''Tb4b4b4]Ta5d6ff"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Transport TypeTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>

T8b949e<!-- Visual Transport Selection -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-2 gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3v-forTff7b72=Ta5d6ff"Te6edf3type Tff7b72in Tb4b4b4[
Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff'TCPClientInterface'Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff'TCP Client'Tb4b4b4,
Te6edf3iconTff7b72: Ta5d6ff'lan-connect'Tb4b4b4,
Te6edf3colorTff7b72: Ta5d6ff'text-blue-500'Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff'TCPServerInterface'Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff'TCP Server'Tb4b4b4,
Te6edf3iconTff7b72: Ta5d6ff'server-network'Tb4b4b4,
Te6edf3colorTff7b72: Ta5d6ff'text-indigo-500'Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{ Te6edf3idTff7b72: Ta5d6ff'UDPInterface'Tb4b4b4, Te6edf3nameTff7b72: Ta5d6ff'UDP'Tb4b4b4, Te6edf3iconTff7b72: Ta5d6ff'broadcast'Tb4b4b4, Te6edf3colorTff7b72: Ta5d6ff'text-cyan-500' Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff'RNodeInterface'Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff'RNode (LoRa)'Tb4b4b4,
Te6edf3iconTff7b72: Ta5d6ff'radio-handheld'Tb4b4b4,
Te6edf3colorTff7b72: Ta5d6ff'text-emerald-500'Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff'I2PInterface'Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff'I2P Tunnel'Tb4b4b4,
Te6edf3iconTff7b72: Ta5d6ff'tunnel'Tb4b4b4,
Te6edf3colorTff7b72: Ta5d6ff'text-purple-500'Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff'SerialInterface'Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff'Serial (Generic)'Tb4b4b4,
Te6edf3iconTff7b72: Ta5d6ff'serial-port'Tb4b4b4,
Te6edf3colorTff7b72: Ta5d6ff'text-amber-500'Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff'KISSInterface'Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff'KISS (TNC)'Tb4b4b4,
Te6edf3iconTff7b72: Ta5d6ff'radio-tower'Tb4b4b4,
Te6edf3colorTff7b72: Ta5d6ff'text-orange-500'Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4{
Te6edf3idTff7b72: Ta5d6ff'AutoInterface'Tb4b4b4,
Te6edf3nameTff7b72: Ta5d6ff'Auto (Local)'Tb4b4b4,
Te6edf3iconTff7b72: Ta5d6ff'auto-fix'Tb4b4b4,
Te6edf3colorTff7b72: Ta5d6ff'text-pink-500'Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4]Ta5d6ff"
Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3typeTb4b4b4.Te6edf3idTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"flex flex-col items-center justify-center p-3 rounded-2xl border transition-all duration-200 text-center gap-1 group"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Tb4b4b4[
Te6edf3newInterfaceType Tff7b72=== Te6edf3typeTb4b4b4.Te6edf3id
Tff7b72? Ta5d6ff'bg-blue-500/10 border-blue-500 ring-1 ring-blue-500/50'
Tff7b72: Ta5d6ff'bg-gray-50/50 dark:bg-zinc-800/30 border-gray-100 dark:border-zinc-800 hover:border-gray-300 dark:hover:border-zinc-600'Tb4b4b4,
Tb4b4b4]Ta5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3newInterfaceType Tff7b72= Te6edf3typeTb4b4b4.Te6edf3idTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon
Tb4b4b4:Te6edf3icon-nameTff7b72=Ta5d6ff"Te6edf3typeTb4b4b4.Te6edf3iconTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"size-6 transition-transform group-hover:scale-110"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Tb4b4b4[Te6edf3newInterfaceType Tff7b72=== Te6edf3typeTb4b4b4.Te6edf3id Tff7b72? Ta5d6ff'text-blue-500' Tff7b72: Te6edf3typeTb4b4b4.Te6edf3colorTb4b4b4]Ta5d6ff"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72span
Te6edf3classTff7b72=Ta5d6ff"text-[10px] font-bold uppercase tracking-tight"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Tb4b4b4[
Te6edf3newInterfaceType Tff7b72=== Te6edf3typeTb4b4b4.Te6edf3id
Tff7b72? Ta5d6ff'text-blue-700 dark:text-blue-400'
Tff7b72: Ta5d6ff'text-gray-600 dark:text-zinc-400'Tb4b4b4,
Tb4b4b4]Ta5d6ff"
Tb4b4b4>
Tff7b72{{ Te6edf3typeTb4b4b4.Te6edf3name Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Fallback/More select for less common types -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"mt-3"Tb4b4b4>
Tb4b4b4<Tff7b72select
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceTypeTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"input-field appearance-none pr-10 !py-1.5 !text-[11px] opacity-70 hover:opacity-100"
Tb4b4b4>
Tb4b4b4<Tff7b72option Tb4b4b4:Te6edf3valueTff7b72=Ta5d6ff"Tff7b72nullTa5d6ff"Tb4b4b4>More options...Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3valueTff7b72=Ta5d6ff"AX25KISSInterface"Tb4b4b4>AX.25 KISS (Amateur Radio)Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3valueTff7b72=Ta5d6ff"LocalInterface"Tb4b4b4>Local Interface (Loopback)Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3valueTff7b72=Ta5d6ff"PipeInterface"Tb4b4b4>Pipe Interface (External)Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3valueTff7b72=Ta5d6ff"RNodeIPInterface"Tb4b4b4>RNode over IPTb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72selectTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Dynamic Interface Specific Settings Column -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-6"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 pb-2 border-b border-gray-100 dark:border-zinc-800"Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"cog-outline" Te6edf3classTff7b72=Ta5d6ff"size-5 text-gray-400" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72h3 Te6edf3classTff7b72=Ta5d6ff"font-bold text-gray-900 dark:text-white"Tb4b4b4>Connection DetailsTb4b4b4<Tb4b4b4/Tff7b72h3Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- No selection placeholder -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Tff7b72!Te6edf3newInterfaceTypeTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"h-48 flex flex-col items-center justify-center text-center p-6 border-2 border-dashed border-gray-100 dark:border-zinc-800 rounded-3xl"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon
Te6edf3icon-nameTff7b72=Ta5d6ff"arrow-left-bold"
Te6edf3classTff7b72=Ta5d6ff"size-10 text-gray-200 dark:text-zinc-800 animate-bounce-left"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72p Te6edf3classTff7b72=Ta5d6ff"text-sm text-gray-400 dark:text-zinc-600 mt-2"Tb4b4b4>
Select an interface type to configure connection settings.
Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Interface Specific Fields -->
Tb4b4b4<Tff7b72div Te6edf3v-else Te6edf3classTff7b72=Ta5d6ff"space-y-6 animate-in fade-in slide-in-from-right-4 duration-300"Tb4b4b4>
T8b949e<!-- TCP Client -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3newInterfaceType Tff7b72=== Ta5d6ff'TCPClientInterface'Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"space-y-4"Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Target HostTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceTargetHostTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"e.g. 1.2.3.4 or example.com"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Target PortTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceTargetPortTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3placeholderTff7b72=Ta5d6ff"4242"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- TCP Server / UDP -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Tb4b4b4[Ta5d6ff'TCPServerInterface'Tb4b4b4, Ta5d6ff'UDPInterface'Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3newInterfaceTypeTb4b4b4)Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"space-y-4"
Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Listen IP (Optional)Tb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceListenIpTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"0.0.0.0"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Listen PortTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceListenPortTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3placeholderTff7b72=Ta5d6ff"4242"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- UDP Extras -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3newInterfaceType Tff7b72=== Ta5d6ff'UDPInterface'Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-2 gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Forward IPTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceForwardIpTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"255.255.255.255"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Forward PortTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceForwardPortTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3placeholderTff7b72=Ta5d6ff"4242"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- I2P Interface -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3newInterfaceType Tff7b72=== Ta5d6ff'I2PInterface'Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"space-y-4"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"bg-blue-50/50 dark:bg-blue-900/10 p-3 rounded-2xl border border-blue-100 dark:border-blue-900/20 text-xs text-blue-800 dark:text-blue-300"
Tb4b4b4>
ⓘ To use the I2P interface, you must have an I2P router running on your system.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Initial Peers (Optional)Tb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-2"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-forTff7b72=Ta5d6ff"Tb4b4b4(Te6edf3peerTb4b4b4, Te6edf3indexTb4b4b4) Tff7b72in Te6edf3I2PSettingsTb4b4b4.Te6edf3newInterfacePeersTa5d6ff"
Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3indexTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2"
Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3I2PSettingsTb4b4b4.Te6edf3newInterfacePeersTb4b4b4[Te6edf3indexTb4b4b4]Ta5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"b32.i2p address"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"text-red-500 hover:text-red-400 p-1"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3removeI2PPeerTb4b4b4(Te6edf3indexTb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"trash-can-outline" Te6edf3classTff7b72=Ta5d6ff"size-5" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"secondary-chip !py-1 !px-3 !text-[10px]"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3addI2PPeerTb4b4b4(Ta5d6ff''Tb4b4b4)Ta5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"plus" Te6edf3classTff7b72=Ta5d6ff"size-3" Tb4b4b4/Tb4b4b4> Add Peer
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- RNode / Hardware -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"
Tb4b4b4[
Ta5d6ff'RNodeInterface'Tb4b4b4,
Ta5d6ff'RNodeIPInterface'Tb4b4b4,
Ta5d6ff'SerialInterface'Tb4b4b4,
Ta5d6ff'KISSInterface'Tb4b4b4,
Ta5d6ff'AX25KISSInterface'Tb4b4b4,
Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3newInterfaceTypeTb4b4b4)
Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"space-y-4"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3newInterfaceType Tff7b72=== Ta5d6ff'RNodeInterface'Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2 pb-2"Tb4b4b4>
Tb4b4b4<Tff7b72Toggle Te6edf3idTff7b72=Ta5d6ff"rnode-use-ip" Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceRNodeUseIPTa5d6ff" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3forTff7b72=Ta5d6ff"rnode-use-ip" Te6edf3classTff7b72=Ta5d6ff"cursor-pointer !mb-0 text-sm"
Tb4b4b4>Connect over network (IP)Tb4b4b4<Tb4b4b4/Tff7b72FormLabel
Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3newInterfaceRNodeUseIP Tff7b72|| Te6edf3newInterfaceType Tff7b72=== Ta5d6ff'RNodeIPInterface'Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-2 gap-4"
Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>HostTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceRNodeIPHostTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"10.0.0.1"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>PortTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceRNodeIPPortTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3placeholderTff7b72=Ta5d6ff"7633"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3v-elseTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Serial PortTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"relative"Tb4b4b4>
Tb4b4b4<Tff7b72select Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfacePortTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"input-field appearance-none pr-10"Tb4b4b4>
Tb4b4b4<Tff7b72option Tb4b4b4:Te6edf3valueTff7b72=Ta5d6ff"Tff7b72nullTa5d6ff" Te6edf3disabledTb4b4b4>Select a port...Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3v-forTff7b72=Ta5d6ff"Te6edf3port Tff7b72in Te6edf3comportsTa5d6ff" Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3portTb4b4b4.Te6edf3deviceTa5d6ff" Tb4b4b4:Te6edf3valueTff7b72=Ta5d6ff"Te6edf3portTb4b4b4.Te6edf3deviceTa5d6ff"Tb4b4b4>
Tff7b72{{ Te6edf3portTb4b4b4.Te6edf3device Tff7b72}} (Tff7b72{{ Te6edf3portTb4b4b4.Te6edf3product Tff7b72?? Ta5d6ff"?" Tff7b72}})
Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72selectTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"absolute inset-y-0 right-0 flex items-center px-3 pointer-events-none text-gray-400"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"chevron-down" Te6edf3classTff7b72=Ta5d6ff"size-5" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"mt-2 flex justify-end"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"text-[10px] uppercase font-bold text-blue-500 hover:text-blue-600 tracking-wider"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3loadComportsTa5d6ff"
Tb4b4b4>
Refresh Ports
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- RNode Radio Parameters -->
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Tb4b4b4[Ta5d6ff'RNodeInterface'Tb4b4b4, Ta5d6ff'RNodeIPInterface'Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3newInterfaceTypeTb4b4b4)Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"space-y-4 pt-4 border-t border-gray-100 dark:border-zinc-800"
Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Frequency (Hz)Tb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center gap-2"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1"Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTb4b4b4.Te6edf3numberTff7b72=Ta5d6ff"Te6edf3RNodeGHzValueTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3minTff7b72=Ta5d6ff"0"
Te6edf3classTff7b72=Ta5d6ff"input-field text-center"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-[10px] text-center text-gray-400 mt-1"Tb4b4b4>GHzTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1"Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTb4b4b4.Te6edf3numberTff7b72=Ta5d6ff"Te6edf3RNodeMHzValueTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3minTff7b72=Ta5d6ff"0"
Te6edf3classTff7b72=Ta5d6ff"input-field text-center"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-[10px] text-center text-gray-400 mt-1"Tb4b4b4>MHzTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex-1"Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTb4b4b4.Te6edf3numberTff7b72=Ta5d6ff"Te6edf3RNodekHzValueTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3minTff7b72=Ta5d6ff"0"
Te6edf3classTff7b72=Ta5d6ff"input-field text-center"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-[10px] text-center text-gray-400 mt-1"Tb4b4b4>kHzTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3formattedFrequencyTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"mt-2 text-center text-sm font-mono text-blue-500 font-bold"
Tb4b4b4>
Tff7b72{{ Te6edf3formattedFrequency Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-2 gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>BandwidthTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72select Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceBandwidthTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"input-field"Tb4b4b4>
Tb4b4b4<Tff7b72option
Te6edf3v-forTff7b72=Ta5d6ff"Te6edf3bw Tff7b72in Te6edf3RNodeInterfaceDefaultsTb4b4b4.Te6edf3bandwidthsTa5d6ff"
Tb4b4b4:Te6edf3keyTff7b72=Ta5d6ff"Te6edf3bwTa5d6ff"
Tb4b4b4:Te6edf3valueTff7b72=Ta5d6ff"Te6edf3bwTa5d6ff"
Tb4b4b4>
Tff7b72{{ Te6edf3bw Tff7b72/ T79c0ff1000 Tff7b72}} kHz
Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72selectTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Power (dBm)Tb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceTxpowerTa5d6ff" Te6edf3typeTff7b72=Ta5d6ff"number" Te6edf3classTff7b72=Ta5d6ff"input-field" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Pipe Interface -->
Tb4b4b4<Tff7b72div Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3newInterfaceType Tff7b72=== Ta5d6ff'PipeInterface'Ta5d6ff" Te6edf3classTff7b72=Ta5d6ff"space-y-4"Tb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3classTff7b72=Ta5d6ff"bg-gray-50/50 dark:bg-zinc-800/30 p-3 rounded-2xl border border-gray-100 dark:border-zinc-800 text-xs text-gray-600 dark:text-zinc-400"
Tb4b4b4>
ⓘ Interface with external programs via stdin/stdout.
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>CommandTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceCommandTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"e.g. netcat -l 5757"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Respawn Delay (s)Tb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3newInterfaceRespawnDelayTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3placeholderTff7b72=Ta5d6ff"5"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Advanced Sections -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-4 pt-4"Tb4b4b4>
T8b949e<!-- RNode Advanced Tools -->
Tb4b4b4<Tff7b72ExpandingSection
Te6edf3v-ifTff7b72=Ta5d6ff"Tb4b4b4[Ta5d6ff'RNodeInterface'Tb4b4b4, Ta5d6ff'RNodeIPInterface'Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3newInterfaceTypeTb4b4b4)Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"glass-card !p-0 overflow-hidden"
Tb4b4b4>
Tb4b4b4<Tff7b72template #Te6edf3titleTb4b4b4>Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold"Tb4b4b4>Calculated ParametersTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>
Tb4b4b4<Tff7b72template #Te6edf3contentTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-6 space-y-6"Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Antenna Gain (dBi)Tb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTb4b4b4.Te6edf3numberTff7b72=Ta5d6ff"Te6edf3RNodeInterfaceLoRaParametersTb4b4b4.Te6edf3antennaGainTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-3 gap-3"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"bg-blue-500/5 p-3 rounded-2xl border border-blue-500/10 text-center"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-[10px] uppercase font-bold text-blue-500 mb-1"Tb4b4b4>
Sensitivity
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-lg font-mono font-bold"Tb4b4b4>
Tff7b72{{ Te6edf3RNodeInterfaceLoRaParametersTb4b4b4.Te6edf3sensitivity Tff7b72?? Ta5d6ff"???" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"bg-blue-500/5 p-3 rounded-2xl border border-blue-500/10 text-center"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-[10px] uppercase font-bold text-blue-500 mb-1"Tb4b4b4>Data RateTb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-lg font-mono font-bold"Tb4b4b4>
Tff7b72{{ Te6edf3RNodeInterfaceLoRaParametersTb4b4b4.Te6edf3dataRate Tff7b72?? Ta5d6ff"???" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"bg-blue-500/5 p-3 rounded-2xl border border-blue-500/10 text-center"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-[10px] uppercase font-bold text-blue-500 mb-1"Tb4b4b4>
Link Budget
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"text-lg font-mono font-bold"Tb4b4b4>
Tff7b72{{ Te6edf3RNodeInterfaceLoRaParametersTb4b4b4.Te6edf3linkBudget Tff7b72?? Ta5d6ff"???" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72ExpandingSectionTb4b4b4>

T8b949e<!-- Interface Discovery Settings -->
Tb4b4b4<Tff7b72ExpandingSection Te6edf3classTff7b72=Ta5d6ff"glass-card !p-0 overflow-hidden"Tb4b4b4>
Tb4b4b4<Tff7b72template #Te6edf3titleTb4b4b4>Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold"Tb4b4b4>Interface DiscoveryTb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>
Tb4b4b4<Tff7b72template #Te6edf3contentTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-6 space-y-6"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center justify-between"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"max-w-md"Tb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label !mb-0"Tb4b4b4>Publish Discovery AnnounceTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72p Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-400"Tb4b4b4>
Makes your node visible to others on the network.
Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72Toggle Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3discoveryTb4b4b4.Te6edf3discoverableTa5d6ff" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3discoveryTb4b4b4.Te6edf3discoverableTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"space-y-4 pt-4 border-t border-gray-100 dark:border-zinc-800 animate-in fade-in slide-in-from-top-2"
Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Discovery NameTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3discoveryTb4b4b4.Te6edf3discovery_nameTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"Human-friendly name"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-2 gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Announce Interval (m)Tb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTb4b4b4.Te6edf3numberTff7b72=Ta5d6ff"Te6edf3discoveryTb4b4b4.Te6edf3announce_intervalTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Reachable OnTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3discoveryTb4b4b4.Te6edf3reachable_onTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"IP or Hostname"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72ExpandingSectionTb4b4b4>

T8b949e<!-- Global Discovery Settings -->
Tb4b4b4<Tff7b72ExpandingSection Te6edf3classTff7b72=Ta5d6ff"glass-card !p-0 overflow-hidden"Tb4b4b4>
Tb4b4b4<Tff7b72template #Te6edf3titleTb4b4b4>Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold"Tb4b4b4>Discovery Listener (Peer)Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>
Tb4b4b4<Tff7b72template #Te6edf3contentTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-6 space-y-6"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex items-center justify-between"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"max-w-md"Tb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label !mb-0"Tb4b4b4>Enable Discovery ListenerTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72p Te6edf3classTff7b72=Ta5d6ff"text-xs text-gray-400"Tb4b4b4>
Listen for announced interfaces and optionally auto-connect.
Tb4b4b4<Tb4b4b4/Tff7b72pTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72Toggle Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3reticulumDiscoveryTb4b4b4.Te6edf3discover_interfacesTa5d6ff" Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div
Te6edf3v-ifTff7b72=Ta5d6ff"Te6edf3reticulumDiscoveryTb4b4b4.Te6edf3discover_interfacesTa5d6ff"
Te6edf3classTff7b72=Ta5d6ff"space-y-4 pt-4 border-t border-gray-100 dark:border-zinc-800 animate-in fade-in slide-in-from-top-2"
Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-1 md:grid-cols-2 gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3reticulumDiscoveryTb4b4b4.Te6edf3interface_discovery_whitelistTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"Whitelist (names, hosts, IDs)"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3reticulumDiscoveryTb4b4b4.Te6edf3interface_discovery_blacklistTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"Blacklist (names, hosts, IDs)"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"flex justify-end"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"primary-chip !text-[10px]"
Tb4b4b4:Te6edf3disabledTff7b72=Ta5d6ff"Te6edf3savingDiscoveryTa5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3saveReticulumDiscoveryConfigTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon Te6edf3icon-nameTff7b72=Ta5d6ff"content-save" Te6edf3classTff7b72=Ta5d6ff"size-3" Tb4b4b4/Tb4b4b4> Save Listener
Prefs
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72ExpandingSectionTb4b4b4>

T8b949e<!-- Shared Advanced Settings -->
Tb4b4b4<Tff7b72ExpandingSection Te6edf3classTff7b72=Ta5d6ff"glass-card !p-0 overflow-hidden"Tb4b4b4>
Tb4b4b4<Tff7b72template #Te6edf3title
Tb4b4b4>Tb4b4b4<Tff7b72span Te6edf3classTff7b72=Ta5d6ff"text-sm font-bold"Tb4b4b4>Advanced Parameters (IFAC, Mode)Tb4b4b4<Tb4b4b4/Tff7b72spanTb4b4b4>Tb4b4b4<Tb4b4b4/Tff7b72template
Tb4b4b4>
Tb4b4b4<Tff7b72template #Te6edf3contentTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"p-6 space-y-6"Tb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-2 gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Interface ModeTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72select Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3modeTa5d6ff" Te6edf3classTff7b72=Ta5d6ff"input-field"Tb4b4b4>
Tb4b4b4<Tff7b72option Tb4b4b4:Te6edf3valueTff7b72=Ta5d6ff"Tff7b72undefinedTa5d6ff"Tb4b4b4>Default (Full)Tb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3valueTff7b72=Ta5d6ff"full"Tb4b4b4>FullTb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3valueTff7b72=Ta5d6ff"gateway"Tb4b4b4>GatewayTb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3valueTff7b72=Ta5d6ff"access_point"Tb4b4b4>Access PointTb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3valueTff7b72=Ta5d6ff"roaming"Tb4b4b4>RoamingTb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tff7b72option Te6edf3valueTff7b72=Ta5d6ff"boundary"Tb4b4b4>BoundaryTb4b4b4<Tb4b4b4/Tff7b72optionTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72selectTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Forced BitrateTb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3bitrateTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"number"
Te6edf3placeholderTff7b72=Ta5d6ff"bps"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"space-y-4 pt-4 border-t border-gray-100 dark:border-zinc-800"Tb4b4b4>
Tb4b4b4<Tff7b72FormLabel Te6edf3classTff7b72=Ta5d6ff"glass-label"Tb4b4b4>Interface Access Code (IFAC)Tb4b4b4<Tb4b4b4/Tff7b72FormLabelTb4b4b4>
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"grid grid-cols-1 md:grid-cols-2 gap-4"Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3network_nameTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"Network Name"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tff7b72input
Te6edf3v-modelTff7b72=Ta5d6ff"Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3passphraseTa5d6ff"
Te6edf3typeTff7b72=Ta5d6ff"text"
Te6edf3placeholderTff7b72=Ta5d6ff"Passphrase"
Te6edf3classTff7b72=Ta5d6ff"input-field"
Tb4b4b4/Tb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72ExpandingSectionTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>

T8b949e<!-- Footer Save Action -->
Tb4b4b4<Tff7b72div Te6edf3classTff7b72=Ta5d6ff"pt-8 flex items-center justify-between gap-4 border-t border-gray-200 dark:border-zinc-800"Tb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"secondary-chip !px-10 !py-3 !text-sm"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3$routerTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{ Te6edf3nameTff7b72: Ta5d6ff'interfaces' Tb4b4b4}Tb4b4b4)Ta5d6ff"
Tb4b4b4>
Cancel
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tff7b72button
Te6edf3typeTff7b72=Ta5d6ff"button"
Te6edf3classTff7b72=Ta5d6ff"primary-chip !px-16 !py-3 !text-sm"
Tb4b4b4:Te6edf3disabledTff7b72=Ta5d6ff"Te6edf3isSavingTa5d6ff"
Tb4b4b4@Te6edf3clickTff7b72=Ta5d6ff"Te6edf3saveInterfaceTa5d6ff"
Tb4b4b4>
Tb4b4b4<Tff7b72MaterialDesignIcon
Tb4b4b4:Te6edf3icon-nameTff7b72=Ta5d6ff"Te6edf3isSaving Tff7b72? Ta5d6ff'loading' Tff7b72: Te6edf3isEditingInterface Tff7b72? Ta5d6ff'content-save' Tff7b72: Ta5d6ff'plus'Ta5d6ff"
Te6edf3classTff7b72=Ta5d6ff"size-5"
Tb4b4b4:Te6edf3classTff7b72=Ta5d6ff"Tb4b4b4{ Ta5d6ff'animate-spin'Tff7b72: Te6edf3isSaving Tb4b4b4}Ta5d6ff"
Tb4b4b4/Tb4b4b4>
Tff7b72{{ Te6edf3isEditingInterface Tff7b72? Ta5d6ff"Update Connection" Tff7b72: Ta5d6ff"Create Connection" Tff7b72}}
Tb4b4b4<Tb4b4b4/Tff7b72buttonTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72divTb4b4b4>
Tb4b4b4<Tb4b4b4/Tff7b72templateTb4b4b4>

Tb4b4b4<Tff7b72scriptTb4b4b4>
Tff7b72import Te6edf3DialogUtils Tff7b72from Ta5d6ff"../../js/DialogUtils"Tb4b4b4;
Tff7b72import Te6edf3ToastUtils Tff7b72from Ta5d6ff"../../js/ToastUtils"Tb4b4b4;
Tff7b72import Te6edf3ExpandingSection Tff7b72from Ta5d6ff"./ExpandingSection.vue"Tb4b4b4;
Tff7b72import Te6edf3FormLabel Tff7b72from Ta5d6ff"../forms/FormLabel.vue"Tb4b4b4;
Tff7b72import Te6edf3Toggle Tff7b72from Ta5d6ff"../forms/Toggle.vue"Tb4b4b4;
Tff7b72import Te6edf3GlobalState Tff7b72from Ta5d6ff"../../js/GlobalState"Tb4b4b4;
Tff7b72import Te6edf3MaterialDesignIcon Tff7b72from Ta5d6ff"../MaterialDesignIcon.vue"Tb4b4b4;

Tff7b72export Tff7b72default Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff"AddInterfacePage"Tb4b4b4,
Te6edf3componentsTff7b72: Tb4b4b4{
Te6edf3MaterialDesignIconTb4b4b4,
Te6edf3FormLabelTb4b4b4,
Te6edf3ExpandingSectionTb4b4b4,
Te6edf3ToggleTb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3dataTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4{
Te6edf3rawConfigInputTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3detectedConfigsTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Te6edf3isSavingTff7b72: Tff7b72falseTb4b4b4,
Te6edf3isEditingInterfaceTff7b72: Tff7b72falseTb4b4b4,

Te6edf3configTff7b72: Tff7b72nullTb4b4b4,

Te6edf3communityInterfacesTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,

Te6edf3comportsTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,

Te6edf3newInterfaceNameTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceTypeTff7b72: Tff7b72nullTb4b4b4,

Te6edf3newInterfaceGroupIDTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceMulticastAddressTypeTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceDevicesTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceIgnoredDevicesTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceDiscoveryScopeTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceDiscoveryPortTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceDataPortTff7b72: Tff7b72nullTb4b4b4,

Te6edf3newInterfaceTargetHostTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceTargetPortTff7b72: Tff7b72nullTb4b4b4,

Te6edf3newInterfaceListenIpTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceListenPortTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceNetworkDeviceTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfacePreferIPV6Tff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceKISSFramingEnabledTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceI2PTunnelingEnabledTff7b72: Tff7b72nullTb4b4b4,

Te6edf3sharedInterfaceSettingsTff7b72: Tb4b4b4{
Te6edf3modeTff7b72: Tff7b72nullTb4b4b4,
Te6edf3network_nameTff7b72: Tff7b72nullTb4b4b4,
Te6edf3passphraseTff7b72: Tff7b72nullTb4b4b4,
Te6edf3ifac_sizeTff7b72: Tff7b72nullTb4b4b4,
Te6edf3bitrateTff7b72: Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4,

Te6edf3discoveryTff7b72: Tb4b4b4{
Te6edf3discoverableTff7b72: Tff7b72falseTb4b4b4,
Te6edf3discovery_nameTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3announce_intervalTff7b72: T79c0ff360Tb4b4b4,
Te6edf3reachable_onTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3discovery_stamp_valueTff7b72: T79c0ff14Tb4b4b4,
Te6edf3discovery_encryptTff7b72: Tff7b72falseTb4b4b4,
Te6edf3publish_ifacTff7b72: Tff7b72falseTb4b4b4,
Te6edf3latitudeTff7b72: Tff7b72nullTb4b4b4,
Te6edf3longitudeTff7b72: Tff7b72nullTb4b4b4,
Te6edf3heightTff7b72: Tff7b72nullTb4b4b4,
Te6edf3discovery_frequencyTff7b72: Tff7b72nullTb4b4b4,
Te6edf3discovery_bandwidthTff7b72: Tff7b72nullTb4b4b4,
Te6edf3discovery_modulationTff7b72: Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4,

Te6edf3reticulumDiscoveryTff7b72: Tb4b4b4{
Te6edf3discover_interfacesTff7b72: Tff7b72falseTb4b4b4,
Te6edf3interface_discovery_sourcesTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3interface_discovery_whitelistTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3interface_discovery_blacklistTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3required_discovery_valueTff7b72: Tff7b72nullTb4b4b4,
Te6edf3autoconnect_discovered_interfacesTff7b72: T79c0ff0Tb4b4b4,
Te6edf3network_identityTff7b72: Ta5d6ff""Tb4b4b4,
Tb4b4b4}Tb4b4b4,

Te6edf3savingDiscoveryTff7b72: Tff7b72falseTb4b4b4,

Te6edf3newInterfaceForwardIpTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceForwardPortTff7b72: Tff7b72nullTb4b4b4,

Te6edf3I2PSettingsTff7b72: Tb4b4b4{
Te6edf3newInterfacePeersTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,

Te6edf3RNodeMultiInterfaceTff7b72: Tb4b4b4{
Te6edf3portTff7b72: Tff7b72nullTb4b4b4,
Te6edf3subInterfacesTff7b72: Tb4b4b4[Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,

Te6edf3newInterfacePortTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceRNodeUseIPTff7b72: Tff7b72falseTb4b4b4,
Te6edf3newInterfaceRNodeIPHostTff7b72: Ta5d6ff"localhost"Tb4b4b4,
Te6edf3newInterfaceRNodeIPPortTff7b72: Ta5d6ff"7633"Tb4b4b4,
Te6edf3RNodeGHzValueTff7b72: T79c0ff0Tb4b4b4,
Te6edf3RNodeMHzValueTff7b72: T79c0ff0Tb4b4b4,
Te6edf3RNodekHzValueTff7b72: T79c0ff0Tb4b4b4,
Te6edf3newInterfaceFrequencyTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceBandwidthTff7b72: T79c0ff125000Tb4b4b4,
Te6edf3newInterfaceTxpowerTff7b72: T79c0ff7Tb4b4b4,
Te6edf3newInterfaceSpreadingFactorTff7b72: T79c0ff12Tb4b4b4,
Te6edf3newInterfaceCodingRateTff7b72: T79c0ff5Tb4b4b4,

T8b949e// Serial, KISS, and AX25KISS options
Te6edf3newInterfaceSpeedTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceDatabitsTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceParityTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceStopbitsTff7b72: Tff7b72nullTb4b4b4,

T8b949e// KISS and AX25KISS
Te6edf3newInterfacePreambleTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceTXTailTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfacePersistenceTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceSlotTimeTff7b72: Tff7b72nullTb4b4b4,

T8b949e// RNode and KISS
Te6edf3newInterfaceCallsignTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceIDIntervalTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceFlowControlTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceAirtimeLimitLongTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceAirtimeLimitShortTff7b72: Tff7b72nullTb4b4b4,

T8b949e// Pipe interface
Te6edf3newInterfaceCommandTff7b72: Tff7b72nullTb4b4b4,
Te6edf3newInterfaceRespawnDelayTff7b72: Tff7b72nullTb4b4b4,

Te6edf3RNodeInterfaceDefaultsTff7b72: Tb4b4b4{
T8b949e// bandwidth in hz
Te6edf3bandwidthsTff7b72: Tb4b4b4[
T79c0ff7800Tb4b4b4, T8b949e// 7.8 kHz
T79c0ff10400Tb4b4b4, T8b949e// 10.4 kHz
T79c0ff15600Tb4b4b4, T8b949e// 15.6 kHz
T79c0ff20800Tb4b4b4, T8b949e// 20.8 kHz
T79c0ff31250Tb4b4b4, T8b949e// 31.25 kHz
T79c0ff41700Tb4b4b4, T8b949e// 41.7 kHz
T79c0ff62500Tb4b4b4, T8b949e// 62.5 kHz
T79c0ff125000Tb4b4b4, T8b949e// 125 kHz
T79c0ff250000Tb4b4b4, T8b949e// 250 kHz
T79c0ff500000Tb4b4b4, T8b949e// 500 kHz
T79c0ff1625000Tb4b4b4, T8b949e// 1625 kHz (for 2.4 GHz SX1280)
Tb4b4b4]Tb4b4b4,
Te6edf3codingratesTff7b72: Tb4b4b4[
T79c0ff5Tb4b4b4, T8b949e// 4:5
T79c0ff6Tb4b4b4, T8b949e// 4:6
T79c0ff7Tb4b4b4, T8b949e// 4:7
T79c0ff8Tb4b4b4, T8b949e// 4:8
Tb4b4b4]Tb4b4b4,
Te6edf3spreadingfactorsTff7b72: Tb4b4b4[T79c0ff5Tb4b4b4, T79c0ff6Tb4b4b4, T79c0ff7Tb4b4b4, T79c0ff8Tb4b4b4, T79c0ff9Tb4b4b4, T79c0ff10Tb4b4b4, T79c0ff11Tb4b4b4, T79c0ff12Tb4b4b4]Tb4b4b4,
Tb4b4b4}Tb4b4b4,

Te6edf3RNodeInterfaceLoRaParametersTff7b72: Tb4b4b4{
Te6edf3antennaGainTff7b72: T79c0ff0Tb4b4b4,
Te6edf3noiseFloorTff7b72: T79c0ff5Tb4b4b4,
Te6edf3sensitivityTff7b72: Tff7b72nullTb4b4b4,
Te6edf3dataRateTff7b72: Tff7b72nullTb4b4b4,
Te6edf3linkBudgetTff7b72: Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3computedTff7b72: Tb4b4b4{
Te6edf3formattedFrequencyTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3totalHz Tff7b72= Tff7b72thisTb4b4b4.Te6edf3calculateFrequencyInHzTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3totalHz Tff7b72>= T79c0ff1e9Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff`Tffd700${Tb4b4b4(Te6edf3totalHz Tff7b72/ T79c0ff1e9Tb4b4b4)Tb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff3Tb4b4b4)Tffd700}Ta5d6ff GHzTa5d6ff`Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3totalHz Tff7b72>= T79c0ff1e6Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff`Tffd700${Tb4b4b4(Te6edf3totalHz Tff7b72/ T79c0ff1e6Tb4b4b4)Tb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff3Tb4b4b4)Tffd700}Ta5d6ff MHzTa5d6ff`Tb4b4b4;
Tb4b4b4} Tff7b72else Tff7b72if Tb4b4b4(Te6edf3totalHz Tff7b72>= T79c0ff1e3Tb4b4b4) Tb4b4b4{
Tff7b72return Ta5d6ff`Tffd700${Tb4b4b4(Te6edf3totalHz Tff7b72/ T79c0ff1e3Tb4b4b4)Tb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff3Tb4b4b4)Tffd700}Ta5d6ff kHzTa5d6ff`Tb4b4b4;
Tb4b4b4}
Tff7b72return Ta5d6ff`Tffd700${Te6edf3totalHzTffd700}Ta5d6ff HzTa5d6ff`Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3watchTff7b72: Tb4b4b4{
Te6edf3newInterfaceBandwidthTff7b72: Ta5d6ff"updateRNodeCalculations"Tb4b4b4,
Te6edf3newInterfaceSpreadingFactorTff7b72: Ta5d6ff"updateRNodeCalculations"Tb4b4b4,
Te6edf3newInterfaceCodingRateTff7b72: Ta5d6ff"updateRNodeCalculations"Tb4b4b4,
Te6edf3newInterfaceTxpowerTff7b72: Ta5d6ff"updateRNodeCalculations"Tb4b4b4,
Ta5d6ff"RNodeInterfaceLoRaParameters.antennaGain"Tff7b72: Ta5d6ff"updateRNodeCalculations"Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3mountedTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3getConfigTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3loadReticulumDiscoveryConfigTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3loadComportsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3loadCommunityInterfacesTb4b4b4(Tb4b4b4)Tb4b4b4;

T8b949e// check if we are editing an interface
Tff7b72const Te6edf3interfaceName Tff7b72= Tff7b72thisTb4b4b4.Te6edf3$routeTb4b4b4.Te6edf3queryTb4b4b4.Te6edf3interface_nameTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3interfaceName Tff7b72!= Tff7b72nullTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isEditingInterface Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3loadInterfaceToEditTb4b4b4(Te6edf3interfaceNameTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3methodsTff7b72: Tb4b4b4{
Tff7b72async Te6edf3getConfigTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/configTa5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3config Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3configTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3updateConfigTb4b4b4(Te6edf3configTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3patchTb4b4b4(Ta5d6ff"/api/v1/config"Tb4b4b4, Te6edf3configTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3config Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3configTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"common.save_failed"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3parseBoolTb4b4b4(Te6edf3valueTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72typeof Te6edf3value Tff7b72=== Ta5d6ff"string"Tb4b4b4) Tb4b4b4{
Tff7b72return Tb4b4b4[Ta5d6ff"true"Tb4b4b4, Ta5d6ff"yes"Tb4b4b4, Ta5d6ff"1"Tb4b4b4, Ta5d6ff"y"Tb4b4b4, Ta5d6ff"on"Tb4b4b4]Tb4b4b4.Te6edf3includesTb4b4b4(Te6edf3valueTb4b4b4.Te6edf3toLowerCaseTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72return Tffa657BooleanTb4b4b4(Te6edf3valueTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3loadReticulumDiscoveryConfigTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/reticulum/discoveryTa5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3discovery Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTff7b72?Tb4b4b4.Te6edf3discovery Tff7b72?? Tb4b4b4{Tb4b4b4}Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3reticulumDiscoveryTb4b4b4.Te6edf3discover_interfaces Tff7b72= Tff7b72thisTb4b4b4.Te6edf3parseBoolTb4b4b4(Te6edf3discoveryTb4b4b4.Te6edf3discover_interfacesTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3reticulumDiscoveryTb4b4b4.Te6edf3interface_discovery_whitelist Tff7b72= Te6edf3discoveryTb4b4b4.Te6edf3interface_discovery_whitelist Tff7b72?? Ta5d6ff""Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3reticulumDiscoveryTb4b4b4.Te6edf3interface_discovery_blacklist Tff7b72= Te6edf3discoveryTb4b4b4.Te6edf3interface_discovery_blacklist Tff7b72?? Ta5d6ff""Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3saveReticulumDiscoveryConfigTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3savingDiscoveryTb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3savingDiscovery Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3payload Tff7b72= Tb4b4b4{
Te6edf3discover_interfacesTff7b72: Tff7b72thisTb4b4b4.Te6edf3reticulumDiscoveryTb4b4b4.Te6edf3discover_interfacesTb4b4b4,
Te6edf3interface_discovery_whitelistTff7b72: Tff7b72thisTb4b4b4.Te6edf3reticulumDiscoveryTb4b4b4.Te6edf3interface_discovery_whitelist Tff7b72|| Tff7b72nullTb4b4b4,
Te6edf3interface_discovery_blacklistTff7b72: Tff7b72thisTb4b4b4.Te6edf3reticulumDiscoveryTb4b4b4.Te6edf3interface_discovery_blacklist Tff7b72|| Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4;
Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3patchTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/reticulum/discoveryTa5d6ff`Tb4b4b4, Te6edf3payloadTb4b4b4)Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3successTb4b4b4(Ta5d6ff"Discovery listener preferences saved."Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Ta5d6ff"Failed to save discovery preferences."Tb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3savingDiscovery Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3loadComportsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/comportsTa5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3comports Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3comportsTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3loadCommunityInterfacesTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/community-interfacesTa5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3communityInterfaces Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3interfacesTb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3loadInterfaceToEditTb4b4b4(Te6edf3interfaceNameTb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3getTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/reticulum/interfacesTa5d6ff`Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3interfaces Tff7b72= Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3interfacesTb4b4b4;
Tff7b72const Te6edf3iface Tff7b72= Te6edf3interfacesTb4b4b4[Te6edf3interfaceNameTb4b4b4]Tb4b4b4;
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3ifaceTb4b4b4) Tb4b4b4{
Te6edf3DialogUtilsTb4b4b4.Te6edf3alertTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3$tTb4b4b4(Ta5d6ff"interfaces.interface_not_found"Tb4b4b4)Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3$routerTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{ Te6edf3nameTff7b72: Ta5d6ff"interfaces" Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

Tff7b72thisTb4b4b4.Te6edf3newInterfaceName Tff7b72= Te6edf3interfaceNameTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceType Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3typeTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceTargetHost Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3target_hostTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceTargetPort Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3target_portTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceListenIp Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3listen_ipTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceListenPort Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3listen_portTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfacePort Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3portTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceFrequency Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3frequencyTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceBandwidth Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3bandwidthTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceTxpower Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3txpowerTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceSpreadingFactor Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3spreadingfactorTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceCodingRate Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3codingrateTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceCommand Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3commandTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceRespawnDelay Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3respawn_delayTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3mode Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3modeTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3bitrate Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3bitrateTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3network_name Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3network_nameTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3passphrase Tff7b72= Te6edf3ifaceTb4b4b4.Te6edf3passphraseTb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3ifaceTb4b4b4.Te6edf3frequencyTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3RNodeGHzValue Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3ifaceTb4b4b4.Te6edf3frequency Tff7b72/ T79c0ff1e9Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3RNodeMHzValue Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3ifaceTb4b4b4.Te6edf3frequency Tff7b72% T79c0ff1e9Tb4b4b4) Tff7b72/ T79c0ff1e6Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3RNodekHzValue Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3ifaceTb4b4b4.Te6edf3frequency Tff7b72% T79c0ff1e6Tb4b4b4) Tff7b72/ T79c0ff1e3Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3handleRawConfigInputTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Tff7b72thisTb4b4b4.Te6edf3rawConfigInputTb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3detectedConfigs Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72returnTb4b4b4;
Tb4b4b4}

Tff7b72const Te6edf3configs Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3sections Tff7b72= Tff7b72thisTb4b4b4.Te6edf3rawConfigInputTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff/\[\[(.*?)\]\]/Tb4b4b4)Tb4b4b4;

T8b949e// sections[0] is everything before the first [[...]]
Tff7b72for Tb4b4b4(Tff7b72let Te6edf3i Tff7b72= T79c0ff1Tb4b4b4; Te6edf3i Tff7b72< Te6edf3sectionsTb4b4b4.Te6edf3lengthTb4b4b4; Te6edf3i Tff7b72+= T79c0ff2Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3name Tff7b72= Te6edf3sectionsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72const Te6edf3content Tff7b72= Te6edf3sectionsTb4b4b4[Te6edf3i Tff7b72+ T79c0ff1Tb4b4b4] Tff7b72|| Ta5d6ff""Tb4b4b4;
Tff7b72const Te6edf3config Tff7b72= Tb4b4b4{ Te6edf3name Tb4b4b4}Tb4b4b4;

T8b949e// simple key-value extraction
Tff7b72const Te6edf3lines Tff7b72= Te6edf3contentTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff"\n"Tb4b4b4)Tb4b4b4;
Tff7b72for Tb4b4b4(Tff7b72const Te6edf3line Tff7b72of Te6edf3linesTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3match Tff7b72= Te6edf3lineTb4b4b4.Te6edf3matchTb4b4b4(Ta5d6ff/^\s*(\w+)\s*=\s*(.*?)\s*$/Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3matchTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3key Tff7b72= Te6edf3matchTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72let Te6edf3value Tff7b72= Te6edf3matchTb4b4b4[T79c0ff2Tb4b4b4]Tb4b4b4.Te6edf3trimTb4b4b4(Tb4b4b4)Tb4b4b4;

T8b949e// clean up quotes if present
Tff7b72if Tb4b4b4(
Tb4b4b4(Te6edf3valueTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff'"'Tb4b4b4) Tff7b72&& Te6edf3valueTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff'"'Tb4b4b4)Tb4b4b4) Tff7b72||
Tb4b4b4(Te6edf3valueTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"'"Tb4b4b4) Tff7b72&& Te6edf3valueTb4b4b4.Te6edf3endsWithTb4b4b4(Ta5d6ff"'"Tb4b4b4)Tb4b4b4)
Tb4b4b4) Tb4b4b4{
Te6edf3value Tff7b72= Te6edf3valueTb4b4b4.Te6edf3substringTb4b4b4(T79c0ff1Tb4b4b4, Te6edf3valueTb4b4b4.Te6edf3length Tff7b72- T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}

Te6edf3configTb4b4b4[Te6edf3keyTb4b4b4] Tff7b72= Te6edf3valueTb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3typeTb4b4b4) Tb4b4b4{
Te6edf3configsTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3configTb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}

Tff7b72thisTb4b4b4.Te6edf3detectedConfigs Tff7b72= Te6edf3configsTb4b4b4;

T8b949e// if only one config, auto-apply it
Tff7b72if Tb4b4b4(Te6edf3configsTb4b4b4.Te6edf3length Tff7b72=== T79c0ff1Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3applyConfigTb4b4b4(Te6edf3configsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3applyConfigTb4b4b4(Te6edf3configTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3configTb4b4b4) Tff7b72returnTb4b4b4;

Tff7b72thisTb4b4b4.Te6edf3newInterfaceName Tff7b72= Te6edf3configTb4b4b4.Te6edf3name Tff7b72|| Tff7b72thisTb4b4b4.Te6edf3newInterfaceNameTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceType Tff7b72= Te6edf3configTb4b4b4.Te6edf3typeTb4b4b4;

T8b949e// Map raw config keys to component data
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3target_hostTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3newInterfaceTargetHost Tff7b72= Te6edf3configTb4b4b4.Te6edf3target_hostTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3target_portTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3newInterfaceTargetPort Tff7b72= Tffa657NumberTb4b4b4(Te6edf3configTb4b4b4.Te6edf3target_portTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3listen_ipTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3newInterfaceListenIp Tff7b72= Te6edf3configTb4b4b4.Te6edf3listen_ipTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3listen_portTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3newInterfaceListenPort Tff7b72= Tffa657NumberTb4b4b4(Te6edf3configTb4b4b4.Te6edf3listen_portTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3forward_ipTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3newInterfaceForwardIp Tff7b72= Te6edf3configTb4b4b4.Te6edf3forward_ipTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3forward_portTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3newInterfaceForwardPort Tff7b72= Tffa657NumberTb4b4b4(Te6edf3configTb4b4b4.Te6edf3forward_portTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3portTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3newInterfacePort Tff7b72= Te6edf3configTb4b4b4.Te6edf3portTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3portTb4b4b4.Te6edf3startsWithTb4b4b4(Ta5d6ff"tcp://"Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3addr Tff7b72= Te6edf3configTb4b4b4.Te6edf3portTb4b4b4.Te6edf3replaceTb4b4b4(Ta5d6ff"tcp://"Tb4b4b4, Ta5d6ff""Tb4b4b4)Tb4b4b4;
Tff7b72const Tb4b4b4[Te6edf3hostTb4b4b4, Te6edf3portTb4b4b4] Tff7b72= Te6edf3addrTb4b4b4.Te6edf3splitTb4b4b4(Ta5d6ff":"Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceRNodeIPHost Tff7b72= Te6edf3hostTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceRNodeIPPort Tff7b72= Te6edf3port Tff7b72|| Ta5d6ff"7633"Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3newInterfaceRNodeUseIP Tff7b72= Tff7b72trueTb4b4b4;
Tb4b4b4}
Tb4b4b4}

T8b949e// Radio params
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3frequencyTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3freq Tff7b72= Tffa657NumberTb4b4b4(Te6edf3configTb4b4b4.Te6edf3frequencyTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3RNodeGHzValue Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Te6edf3freq Tff7b72/ T79c0ff1e9Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3RNodeMHzValue Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3freq Tff7b72% T79c0ff1e9Tb4b4b4) Tff7b72/ T79c0ff1e6Tb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3RNodekHzValue Tff7b72= Tffa657MathTb4b4b4.Te6edf3floorTb4b4b4(Tb4b4b4(Te6edf3freq Tff7b72% T79c0ff1e6Tb4b4b4) Tff7b72/ T79c0ff1e3Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3bandwidthTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3newInterfaceBandwidth Tff7b72= Tffa657NumberTb4b4b4(Te6edf3configTb4b4b4.Te6edf3bandwidthTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3txpowerTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3newInterfaceTxpower Tff7b72= Tffa657NumberTb4b4b4(Te6edf3configTb4b4b4.Te6edf3txpowerTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3spreadingfactorTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3newInterfaceSpreadingFactor Tff7b72= Tffa657NumberTb4b4b4(Te6edf3configTb4b4b4.Te6edf3spreadingfactorTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3codingrateTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3newInterfaceCodingRate Tff7b72= Tffa657NumberTb4b4b4(Te6edf3configTb4b4b4.Te6edf3codingrateTb4b4b4)Tb4b4b4;

T8b949e// KISS/AX.25
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3callsignTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3newInterfaceCallsign Tff7b72= Te6edf3configTb4b4b4.Te6edf3callsignTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3ssidTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3newInterfaceSSID Tff7b72= Te6edf3configTb4b4b4.Te6edf3ssidTb4b4b4;

T8b949e// Advanced
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3modeTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3mode Tff7b72= Te6edf3configTb4b4b4.Te6edf3modeTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3bitrateTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3bitrate Tff7b72= Tffa657NumberTb4b4b4(Te6edf3configTb4b4b4.Te6edf3bitrateTb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3network_nameTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3network_name Tff7b72= Te6edf3configTb4b4b4.Te6edf3network_nameTb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3configTb4b4b4.Te6edf3passphraseTb4b4b4) Tff7b72thisTb4b4b4.Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3passphrase Tff7b72= Te6edf3configTb4b4b4.Te6edf3passphraseTb4b4b4;

Te6edf3ToastUtilsTb4b4b4.Te6edf3successTb4b4b4(Ta5d6ff`Ta5d6ffImported configuration for "Tffd700${Te6edf3configTb4b4b4.Te6edf3nameTffd700}Ta5d6ff"Ta5d6ff`Tb4b4b4)Tb4b4b4;

T8b949e// clear input if applied
Tff7b72thisTb4b4b4.Te6edf3rawConfigInput Tff7b72= Ta5d6ff""Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3detectedConfigs Tff7b72= Tb4b4b4[Tb4b4b4]Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tff7b72async Te6edf3saveInterfaceTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72thisTb4b4b4.Te6edf3isSavingTb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3isSaving Tff7b72= Tff7b72trueTb4b4b4;
Tff7b72try Tb4b4b4{
Tff7b72const Te6edf3discoveryEnabled Tff7b72= Tff7b72thisTb4b4b4.Te6edf3discoveryTb4b4b4.Te6edf3discoverable Tff7b72=== Tff7b72trueTb4b4b4;
Tff7b72const Te6edf3freqHz Tff7b72= Tff7b72thisTb4b4b4.Te6edf3calculateFrequencyInHzTb4b4b4(Tb4b4b4)Tb4b4b4;

Tff7b72const Te6edf3response Tff7b72= Tff7b72await Tffa657windowTb4b4b4.Te6edf3axiosTb4b4b4.Te6edf3postTb4b4b4(Ta5d6ff`Ta5d6ff/api/v1/reticulum/interfaces/addTa5d6ff`Tb4b4b4, Tb4b4b4{
Te6edf3allow_overwriting_interfaceTff7b72: Tff7b72thisTb4b4b4.Te6edf3isEditingInterfaceTb4b4b4,
Te6edf3nameTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceNameTb4b4b4,
Te6edf3typeTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceTypeTb4b4b4,
Te6edf3target_hostTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceTargetHostTb4b4b4,
Te6edf3target_portTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceTargetPortTb4b4b4,
Te6edf3listen_ipTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceListenIpTb4b4b4,
Te6edf3listen_portTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceListenPortTb4b4b4,
Te6edf3portTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceRNodeUseIP
Tff7b72? Ta5d6ff`Ta5d6fftcp://Tffd700${Tff7b72thisTb4b4b4.Te6edf3newInterfaceRNodeIPHostTffd700}Ta5d6ff:Tffd700${Tff7b72thisTb4b4b4.Te6edf3newInterfaceRNodeIPPortTffd700}Ta5d6ff`
Tff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfacePortTb4b4b4,
Te6edf3frequencyTff7b72: Te6edf3freqHzTb4b4b4,
Te6edf3bandwidthTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceBandwidthTb4b4b4,
Te6edf3txpowerTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceTxpowerTb4b4b4,
Te6edf3spreadingfactorTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceSpreadingFactorTb4b4b4,
Te6edf3codingrateTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceCodingRateTb4b4b4,
Te6edf3commandTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceCommandTb4b4b4,
Te6edf3respawn_delayTff7b72: Tff7b72thisTb4b4b4.Te6edf3newInterfaceRespawnDelayTb4b4b4,
Te6edf3discoverableTff7b72: Te6edf3discoveryEnabled Tff7b72? Ta5d6ff"yes" Tff7b72: Tff7b72nullTb4b4b4,
Te6edf3discovery_nameTff7b72: Te6edf3discoveryEnabled Tff7b72? Tff7b72thisTb4b4b4.Te6edf3discoveryTb4b4b4.Te6edf3discovery_name Tff7b72: Tff7b72nullTb4b4b4,
Te6edf3announce_intervalTff7b72: Te6edf3discoveryEnabled Tff7b72? Tffa657NumberTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3discoveryTb4b4b4.Te6edf3announce_intervalTb4b4b4) Tff7b72: Tff7b72nullTb4b4b4,
Te6edf3reachable_onTff7b72: Te6edf3discoveryEnabled Tff7b72? Tff7b72thisTb4b4b4.Te6edf3discoveryTb4b4b4.Te6edf3reachable_on Tff7b72: Tff7b72nullTb4b4b4,
Te6edf3modeTff7b72: Tff7b72thisTb4b4b4.Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3mode Tff7b72|| Ta5d6ff"full"Tb4b4b4,
Te6edf3bitrateTff7b72: Tff7b72thisTb4b4b4.Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3bitrateTb4b4b4,
Te6edf3network_nameTff7b72: Tff7b72thisTb4b4b4.Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3network_nameTb4b4b4,
Te6edf3passphraseTff7b72: Tff7b72thisTb4b4b4.Te6edf3sharedInterfaceSettingsTb4b4b4.Te6edf3passphraseTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;

Tff7b72if Tb4b4b4(Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3messageTb4b4b4) Te6edf3ToastUtilsTb4b4b4.Te6edf3successTb4b4b4(Te6edf3responseTb4b4b4.Te6edf3dataTb4b4b4.Te6edf3messageTb4b4b4)Tb4b4b4;
Te6edf3GlobalStateTb4b4b4.Te6edf3hasPendingInterfaceChanges Tff7b72= Tff7b72trueTb4b4b4;
Te6edf3GlobalStateTb4b4b4.Te6edf3modifiedInterfaceNamesTb4b4b4.Te6edf3addTb4b4b4(Tff7b72thisTb4b4b4.Te6edf3newInterfaceNameTb4b4b4)Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3$routerTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{ Te6edf3nameTff7b72: Ta5d6ff"interfaces" Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4) Tb4b4b4{
Tff7b72const Te6edf3message Tff7b72= Te6edf3eTb4b4b4.Te6edf3responseTff7b72?Tb4b4b4.Te6edf3dataTff7b72?Tb4b4b4.Te6edf3message Tff7b72?? Ta5d6ff"Failed to save interface connection."Tb4b4b4;
Te6edf3ToastUtilsTb4b4b4.Te6edf3errorTb4b4b4(Te6edf3messageTb4b4b4)Tb4b4b4;
Te6edf3consoleTb4b4b4.Te6edf3logTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4;
Tb4b4b4} Tff7b72finally Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3isSaving Tff7b72= Tff7b72falseTb4b4b4;
Tb4b4b4}
Tb4b4b4}Tb4b4b4,
Te6edf3calculateFrequencyInHzTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72thisTb4b4b4.Te6edf3RNodeGHzValue Tff7b72* T79c0ff1e9 Tff7b72+ Tff7b72thisTb4b4b4.Te6edf3RNodeMHzValue Tff7b72* T79c0ff1e6 Tff7b72+ Tff7b72thisTb4b4b4.Te6edf3RNodekHzValue Tff7b72* T79c0ff1e3Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3updateRNodeCalculationsTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3calculateRNodeParametersTb4b4b4(
Tff7b72thisTb4b4b4.Te6edf3newInterfaceBandwidthTb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3newInterfaceSpreadingFactorTb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3newInterfaceCodingRateTb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3RNodeInterfaceLoRaParametersTb4b4b4.Te6edf3noiseFloorTb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3RNodeInterfaceLoRaParametersTb4b4b4.Te6edf3antennaGainTb4b4b4,
Tff7b72thisTb4b4b4.Te6edf3newInterfaceTxpower
Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3calculateRNodeParametersTb4b4b4(Te6edf3bandwidthTb4b4b4, Te6edf3spreadingFactorTb4b4b4, Te6edf3codingRateTb4b4b4, Te6edf3noiseFloorTb4b4b4, Te6edf3antennaGainTb4b4b4, Te6edf3transmitPowerTb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Tff7b72!Te6edf3bandwidth Tff7b72|| Tff7b72!Te6edf3spreadingFactor Tff7b72|| Tff7b72!Te6edf3codingRateTb4b4b4) Tff7b72returnTb4b4b4;
Tff7b72const Te6edf3crn Tff7b72= Tb4b4b4{ T79c0ff5Tff7b72: T79c0ff1Tb4b4b4, T79c0ff6Tff7b72: T79c0ff2Tb4b4b4, T79c0ff7Tff7b72: T79c0ff3Tb4b4b4, T79c0ff8Tff7b72: T79c0ff4 Tb4b4b4}Tb4b4b4;
Tff7b72const Te6edf3cr Tff7b72= Te6edf3crnTb4b4b4[Te6edf3codingRateTb4b4b4]Tb4b4b4;
Tff7b72const Te6edf3sfn Tff7b72= Tb4b4b4{ T79c0ff5Tff7b72: Tff7b72-T79c0ff2.5Tb4b4b4, T79c0ff6Tff7b72: Tff7b72-T79c0ff5Tb4b4b4, T79c0ff7Tff7b72: Tff7b72-T79c0ff7.5Tb4b4b4, T79c0ff8Tff7b72: Tff7b72-T79c0ff10Tb4b4b4, T79c0ff9Tff7b72: Tff7b72-T79c0ff12.5Tb4b4b4, T79c0ff10Tff7b72: Tff7b72-T79c0ff15Tb4b4b4, T79c0ff11Tff7b72: Tff7b72-T79c0ff17.5Tb4b4b4, T79c0ff12Tff7b72: Tff7b72-T79c0ff20 Tb4b4b4}Tb4b4b4;
Tff7b72let Te6edf3dataRate Tff7b72=
Te6edf3spreadingFactor Tff7b72* Tb4b4b4(T79c0ff4 Tff7b72/ Tb4b4b4(T79c0ff4 Tff7b72+ Te6edf3crTb4b4b4) Tff7b72/ Tb4b4b4(Tffa657MathTb4b4b4.Te6edf3powTb4b4b4(T79c0ff2Tb4b4b4, Te6edf3spreadingFactorTb4b4b4) Tff7b72/ Tb4b4b4(Te6edf3bandwidth Tff7b72/ T79c0ff1000Tb4b4b4)Tb4b4b4)Tb4b4b4) Tff7b72* T79c0ff1000Tb4b4b4;
Tff7b72let Te6edf3sensitivity Tff7b72= Tff7b72-T79c0ff174 Tff7b72+ T79c0ff10 Tff7b72* Tffa657MathTb4b4b4.Te6edf3log10Tb4b4b4(Te6edf3bandwidthTb4b4b4) Tff7b72+ Te6edf3noiseFloor Tff7b72+ Tb4b4b4(Te6edf3sfnTb4b4b4[Te6edf3spreadingFactorTb4b4b4] Tff7b72|| T79c0ff0Tb4b4b4)Tb4b4b4;
Tff7b72if Tb4b4b4(Te6edf3bandwidth Tff7b72=== T79c0ff203125 Tff7b72|| Te6edf3bandwidth Tff7b72=== T79c0ff406250 Tff7b72|| Te6edf3bandwidth Tff7b72> T79c0ff500000Tb4b4b4) Tb4b4b4{
Te6edf3sensitivity Tff7b72= Tff7b72-T79c0ff165.6 Tff7b72+ T79c0ff10 Tff7b72* Tffa657MathTb4b4b4.Te6edf3log10Tb4b4b4(Te6edf3bandwidthTb4b4b4) Tff7b72+ Te6edf3noiseFloor Tff7b72+ Tb4b4b4(Te6edf3sfnTb4b4b4[Te6edf3spreadingFactorTb4b4b4] Tff7b72|| T79c0ff0Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tff7b72let Te6edf3linkBudget Tff7b72= Te6edf3transmitPower Tff7b72- Te6edf3sensitivity Tff7b72+ Te6edf3antennaGainTb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3RNodeInterfaceLoRaParametersTb4b4b4.Te6edf3dataRate Tff7b72=
Te6edf3dataRate Tff7b72< T79c0ff1000 Tff7b72? Ta5d6ff`Tffd700${Te6edf3dataRateTb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff0Tb4b4b4)Tffd700}Ta5d6ff bpsTa5d6ff` Tff7b72: Ta5d6ff`Tffd700${Tb4b4b4(Te6edf3dataRate Tff7b72/ T79c0ff1000Tb4b4b4)Tb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff2Tb4b4b4)Tffd700}Ta5d6ff kbpsTa5d6ff`Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3RNodeInterfaceLoRaParametersTb4b4b4.Te6edf3linkBudget Tff7b72= Ta5d6ff`Tffd700${Te6edf3linkBudgetTb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff1Tb4b4b4)Tffd700}Ta5d6ff dBTa5d6ff`Tb4b4b4;
Tff7b72thisTb4b4b4.Te6edf3RNodeInterfaceLoRaParametersTb4b4b4.Te6edf3sensitivity Tff7b72= Ta5d6ff`Tffd700${Te6edf3sensitivityTb4b4b4.Te6edf3toFixedTb4b4b4(T79c0ff1Tb4b4b4)Tffd700}Ta5d6ff dBmTa5d6ff`Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3addI2PPeerTb4b4b4(Te6edf3address Tff7b72= Ta5d6ff""Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3I2PSettingsTb4b4b4.Te6edf3newInterfacePeersTb4b4b4.Te6edf3pushTb4b4b4(Te6edf3addressTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3removeI2PPeerTb4b4b4(Te6edf3indexTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3I2PSettingsTb4b4b4.Te6edf3newInterfacePeersTb4b4b4.Te6edf3spliceTb4b4b4(Te6edf3indexTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3addSubInterfaceTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3RNodeMultiInterfaceTb4b4b4.Te6edf3subInterfacesTb4b4b4.Te6edf3pushTb4b4b4(Tb4b4b4{
Te6edf3nameTff7b72: Ta5d6ff""Tb4b4b4,
Te6edf3frequencyTff7b72: Tff7b72nullTb4b4b4,
Te6edf3bandwidthTff7b72: Tff7b72nullTb4b4b4,
Te6edf3txpowerTff7b72: Tff7b72nullTb4b4b4,
Te6edf3spreadingfactorTff7b72: Tff7b72nullTb4b4b4,
Te6edf3codingrateTff7b72: Tff7b72nullTb4b4b4,
Te6edf3vportTff7b72: Tff7b72nullTb4b4b4,
Tb4b4b4}Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3useKISSAX25Tb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3newInterfaceType Tff7b72=
Tff7b72thisTb4b4b4.Te6edf3newInterfaceType Tff7b72=== Ta5d6ff"AX25KISSInterface" Tff7b72? Ta5d6ff"KISSInterface" Tff7b72: Ta5d6ff"AX25KISSInterface"Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Te6edf3removeSubInterfaceTb4b4b4(Te6edf3idxTb4b4b4) Tb4b4b4{
Tff7b72thisTb4b4b4.Te6edf3RNodeMultiInterfaceTb4b4b4.Te6edf3subInterfacesTb4b4b4.Te6edf3spliceTb4b4b4(Te6edf3idxTb4b4b4, T79c0ff1Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4,
Tb4b4b4}Tb4b4b4;
Tb4b4b4<Tb4b4b4/Tff7b72scriptTb4b4b4>

Tb4b4b4<Tff7b72style Te6edf3scopedTb4b4b4>
Tb4b4b4.T56d364glass-card Tb4b4b4{
@apply bg-white/95 Te6edf3darkTb4b4b4:Te6edf3bg-zinc-900Tff7b72/T79c0ff85 Te6edf3backdrop-blur Tff7b72border Tff7b72borderTff7b72-Tff7b72grayT79c0ff-200 Te6edf3darkTff7b72:Tff7b72borderTff7b72-Te6edf3zinc-800 Te6edf3rounded-3xl Te6edf3shadow-xl Te6edf3p-6Tb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364input-field Tb4b4b4{
@apply bg-gray-50/90 Te6edf3darkTb4b4b4:Te6edf3bg-zinc-900Tff7b72/T79c0ff80 Tff7b72border Tff7b72borderTff7b72-Tff7b72grayT79c0ff-200 Te6edf3darkTff7b72:Tff7b72borderTff7b72-Te6edf3zinc-700 Tff7b72textTff7b72-Te6edf3sm Te6edf3rounded-2xl Te6edf3focusTff7b72:Te6edf3ring-2 Te6edf3focusTff7b72:Te6edf3ring-blue-400 Te6edf3focusTff7b72:Tff7b72borderTff7b72-Tff7b72blueT79c0ff-400 Te6edf3darkTff7b72:Te6edf3focusTff7b72:Te6edf3ring-blue-500 Te6edf3darkTff7b72:Te6edf3focusTff7b72:Tff7b72borderTff7b72-Tff7b72blueT79c0ff-500 Tff7b72block Te6edf3w-full Te6edf3p-2T79c0ff.5 Tff7b72textTff7b72-Tff7b72grayT79c0ff-900 Te6edf3darkTff7b72:Tff7b72textTff7b72-Tff7b72grayT79c0ff-100 Tff7b72transitionTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364glass-label Tb4b4b4{
@apply mb-1.5 block text-xs uppercase font-bold text-gray-500 Te6edf3darkTb4b4b4:Tff7b72textTff7b72-Te6edf3zinc-400 Te6edf3tracking-widerTb4b4b4;
Tb4b4b4}
Tb4b4b4.T56d364glass-field Tb4b4b4{
@apply space-y-1Tb4b4b4;
Tb4b4b4}
Tb4b4b4<Tb4b4b4/Tff7b72styleTb4b4b4>


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────